local strings  = {}

---------------------------------------
--函数名:strings.dec2bin
--功能 ：无符号十进制转二进制数据
--@param1:一个十进制的数
-- bin = strings.dec2bin(n)
---------------------------------------
function strings.dec2bin(n)
    local t=""
    while( n > 0 ) do 
        --print(math.floor(n%2))
        t = (math.floor(n%2))..t
        n=(n- n%2 )/2
    end
    return t
end

---------------------------------------
--函数名:strings.hex2dec
--功能 ：十六进制转十进制数据
--@param1:十六进制数据的字符串
-- dec = strings.hex2dec(n)
---------------------------------------
function strings.hex2dec(n)
    return tonumber(n, 16)
end

---------------------------------------
--函数名:int2hex
--功能 ：32位int的十进制表示转8位十六进制
-- 表示
--例如：12 --> 0000000c  
-- -12 --> fffffff4
-- int2hex(12) --> 0000000c  
---------------------------------------
function strings.int2hex(x)
    local b32HH = (x >> 24) & 0xff;
    local b32HL = (x >> 16) & 0xff;
    local b32LH = (x >>  8) & 0xff;
    local b32LL = (x      ) & 0xff;
    local a = string.format("%02x",b32HH)
    local b = string.format("%02x",b32HL)
    local c = string.format("%02x",b32LH)
    local d = string.format("%02x",b32LL)
    local e=a..b..c..d
    return e
end

---------------------------------------
--函数名:short2hex2hex
--功能 ：16位int的十进制表示转8位十六进制
-- 表示
--例如：12 --> 000c  
-- -12 --> fff4
-- int2hex(12) --> 000c  
---------------------------------------
function strings.short2hex(x)
    local b32LH = (x >>  8) & 0xff;
    local b32LL = (x      ) & 0xff;
    local a = string.format("%02x",b32LH)
    local b = string.format("%02x",b32LL)
    local e=a..b
    return e
end

---------------------------------------
--函数名:char2hex
--功能 ：十进制char转16进制
--输入： 0-255 
--返回: 转换后的字符串
--例如: 12  --> 0c  
--     -12  --> f4
-- char2hex(12)--> 0c
---------------------------------------
function strings.char2hex(x)
    x= x & 0xff;
    return string.format("%02x",x)
end

-------------------------------------------------------------
--函数名:toHex
--功能 ：字符串转其对应的ASCII
-- @string str 输入字符串
-- @string[opt=""] separator 输出的16进制字符串分隔符
-- @return hexstring 16进制组成的串
-- @return len 输入的字符串长度
-- 示例
-- string.toHex("\1\2\3") -> "010203" 3
-- string.toHex("123abc") -> "313233616263" 6
-- string.toHex("123abc"," ") -> "31 32 33 61 62 63 " 6
-- d,len=strings.toHex("123"," ") 
---------------------------------------------------------------
function strings.toHex(str, separator)
    return str:gsub('.', function(c)
        return string.format("%02X" .. (separator or ""), string.byte(c))
    end)
end

--------------------------------------------------------------------------------
--函数名:fromHex
--功能 ：将HEX字符串转成Lua字符串，
-- 如"313233616263"转为"123abc", 
-- 函数里加入了过滤分隔符，可以过滤掉大部分分隔符（可参见正则表达式中\s和\p的范围）。
-- @string hex,16进制组成的串
-- @return charstring,字符组成的串
-- @return len,输出字符串的长度
-- @usage
-- strings.fromHex("010203")       ->  "\1\2\3"
-- strings.fromHex("313233616263:) ->  "123abc"
---------------------------------------------------------------------------------
function strings.fromHex(hex)
    --滤掉分隔符
    local hex = hex:gsub("[%s%p]", ""):upper()
    return hex:gsub("%x%x", function(c)
        return string.char(tonumber(c, 16))
    end)
end

-----------------------------------------------------------------
--- 返回字符串tonumber的转义字符串(用来支持超过31位整数的转换)
-- @string str 输入字符串
-- @return str 转换后的lua 二进制字符串
-- @return len 转换了多少个字符
-- @usage
-- strings.toValue("123456") -> "\1\2\3\4\5\6"  6
-- strings.toValue("123abc") -> "\1\2\3\a\b\c"  6
-----------------------------------------------------------------
function strings.toValue(str)
    return strings.fromHex(str:gsub("%x", "0%1"))
end

-------------------------------------------------------
--- 返回utf8编码字符串的长度
-- @string str,utf8编码的字符串,支持中文
-- @return number,返回字符串长度
-- @usage local cnt = strings.utf8Len("中国"),str = 2
------------------------------------------------------
function strings.utf8Len(str)
    local len = #str
    local left = len
    local cnt = 0
    local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
    while left ~= 0 do
        local tmp = string.byte(str, -left)
        local i = #arr
        while arr[i] do
            if tmp >= arr[i] then
                left = left - i
                break
            end
            i = i - 1
        end
        cnt = cnt + 1
    end
    return cnt
end

----------------------------------------------------------------
--- 按照指定分隔符分割字符串
-- @string str 输入字符串
-- @string delimiter 分隔符
-- @return 分割后的字符串列表
-- @usage "123,456,789":split(',') -> {'123','456','789'}
----------------------------------------------------------------
function strings.split(str, delimiter)
    local strlist, tmp = {}, string.byte(delimiter)
    if delimiter == "" then
        for i = 1, #str do strlist[i] = str:sub(i, i) end
    else
        for substr in string.gmatch(str .. delimiter, "(.-)" .. (((tmp > 96 and tmp < 123) or (tmp > 64 and tmp < 91) or (tmp > 47 and tmp < 58)) and delimiter or "%" .. delimiter)) do
            table.insert(strlist, substr)
        end
    end
    return strlist
end


return strings
